package base.java8;

import java.util.Arrays;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * 1. Optional的创建
 * <p>
 * * {@link Optional#empty()}                创建一个空的Optional
 * * {@link Optional#of(Object)}             通过T构建一个Optional,如果T为空会报NPE
 * * {@link Optional#ofNullable(Object)}     通过T构建一个Optional,如果T为空会返回一个空的Optional
 * <p>
 * 2. Optional常用方法
 * <p>
 * * {@link Optional#get()}                  如果在这个Optional中包含这个值,返回值,否则抛出异常
 * * {@link Optional#isPresent()}            如果值存在则方法会返回true,否则返回 false
 * * {@link Optional#isEmpty()}              判断值是否为空
 * * {@link Optional#ifPresent(Consumer)}    如果值存在则使用该值调用 consumer , 否则不做任何事情
 * * {@link Optional#ifPresentOrElse(Consumer, Runnable)}  如果值存在则使用该值调用consumer,否则执行Runnable
 * * {@link Optional#filter(Predicate)}      过滤
 * * {@link Optional#map(Function)}          转换(map中获取的返回值自动被Optional包装,即返回值)
 * * {@link Optional#flatMap(Function)}      转换(flatMap中返回值保持不变,但必须是Optional类型)
 * * {@link Optional#or(Supplier)}           如果一个值存在,否则返回一个可选产生通过供给功能
 * * {@link Optional#stream()}               如果值存在,将其转换成Stream
 * * {@link Optional#orElse(Object)}         如果值为空就返回自定义的值
 * * {@link Optional#orElseGet(Supplier)}    如果值为空就返回一个生产值的函数
 * * {@link Optional#orElseThrow()}          如果值为空就抛出异常
 * * {@link Optional#orElseThrow(Supplier)}  如果值为空就返回一个生产异常的函数
 * <p>
 *
 * @author 王霄
 * @date 2021/9/11 12:34
 */
public class OptionalDemo {
    public static void main(String[] args) {

        System.out.println(Optional.of(10).or(() -> Optional.of(100)).orElse(null));
        //如果第一个不存在就返回第二个,如果第二个不存在就返回1000,都不存在返回null
        System.out.println(Optional.empty()
                .or(Optional::empty)
                .or(() -> Optional.of(1000)).orElse(null));

        Optional.of(Arrays.asList(1, 2, 3))
                .stream().flatMap(Collection::stream)
                .forEach(System.out::println);
    }
}
